home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / util / conv / nocode.lha / nocode / nocode.e next >
Encoding:
Text File  |  1999-07-20  |  4.0 KB  |  136 lines

  1. OPT OSVERSION=37
  2.  
  3. MODULE 'dos/dos'
  4.  
  5. ENUM ERR_NONE,ERR_READARGS,ERR_OPENREAD,ERR_EXAMINEFH,ERR_READ,ERR_READSHORT,
  6. ERR_OPENWRITE,ERR_WRITE,ERR_WRITESHORT
  7.  
  8. PROC main() HANDLE
  9.     DEF ver,args[4]:ARRAY OF LONG,rdargs=NIL,code,code2,
  10.     fhread=0,fib=0:PTR TO fileinfoblock,infilesize,buffer:PTR TO CHAR,read,
  11.     outfilesize,changes,fhwrite=0,written
  12.  
  13.     ver:='$VER: nocode 1.1 (19.7.99)'
  14.     args:=[NIL,NIL,NIL,NIL]
  15.     buffer:=NIL
  16.  
  17.     IF (rdargs:=ReadArgs('INFILE/A,OUTFILE,C=CODE/N/A,R=REPLACECODE/N',args,NIL))=NIL THEN Raise(ERR_READARGS)
  18.     PrintF('\s\n',ver+6)
  19.     PrintF('--\n')
  20.     IF args[1]=NIL THEN args[1]:=args[0]
  21.     code:=args[2]
  22.     code:=^code
  23.     IF (code2:=args[3]) THEN code2:=^code2
  24.     IF (fhread:=Open(args[0],MODE_OLDFILE))=0 THEN Raise(ERR_OPENREAD)
  25.     NEW fib
  26.     IF (ExamineFH(fhread,fib))=FALSE THEN Raise(ERR_EXAMINEFH)
  27.     infilesize:=fib.size
  28.     END fib
  29.     fib:=0
  30.     NEW buffer[infilesize]
  31.     PrintF('Reading "\s"... ',args[0])
  32.     IF (read:=Read(fhread,buffer,infilesize))=-1 THEN Raise(ERR_READ)
  33.     IF (read<>infilesize) THEN Raise(ERR_READSHORT)
  34.     PrintF('read \d bytes.\n',read)
  35.     Close(fhread)
  36.     fhread:=0
  37.     IF args[3]
  38.         outfilesize:=infilesize
  39.         changes:=replacecode(buffer,infilesize,code,code2)
  40.     ELSE
  41.         outfilesize:=removecode(buffer,infilesize,code)
  42.     ENDIF
  43.     IF (fhwrite:=Open(args[1],MODE_NEWFILE))=0 THEN Raise(ERR_OPENWRITE)
  44.     IF args[1]=args[0]
  45.         PrintF('Overwriting "\s"... ',args[1])
  46.     ELSE
  47.         PrintF('Writing "\s"... ',args[1])
  48.     ENDIF
  49.     IF (written:=Write(fhwrite,buffer,outfilesize))=-1 THEN Raise(ERR_WRITE)
  50.     IF (written<>outfilesize) THEN Raise(ERR_WRITESHORT)
  51.     PrintF('wrote \d bytes.\n\n',written)
  52. EXCEPT DO
  53.     IF fhwrite THEN Close(fhwrite)
  54.     IF buffer THEN END buffer
  55.     IF fib THEN END fib
  56.     IF fhread THEN Close(fhread)
  57.     IF rdargs THEN FreeArgs(rdargs)
  58.     SELECT exception
  59.         CASE ERR_READARGS
  60.             PrintF('nocode - Bad commandline arguments (ReadArgs).\n')
  61.         CASE ERR_OPENREAD
  62.             PrintF('Cannot open "\s" for reading (Open).\n',args[0])
  63.         CASE ERR_EXAMINEFH
  64.             PrintF('Cannot examine filehandle (ExamineFH).\n')
  65.         CASE ERR_READ
  66.             PrintF('Cannot read "\s" (Read).\n',args[0])
  67.         CASE ERR_READSHORT
  68.             PrintF('Cannot read "\s" - read data short (Read).\n',args[0])
  69.         CASE ERR_OPENWRITE
  70.             PrintF('Cannot open "\s" for writing (Open).\n',args[1])
  71.         CASE ERR_WRITE
  72.             PrintF('Cannot write "\s" (Write).\n',args[1])
  73.         CASE ERR_WRITESHORT
  74.             PrintF('Cannot write "\s" - written data short (Write).\n',args[1])
  75.         CASE "MEM"
  76.             PrintF('Cannot allocate enough (approx. \d bytes) memory (NEW).\n',infilesize)
  77.     ENDSELECT
  78. ENDPROC
  79.  
  80. PROC removecode(buffer,bufferlen,code)
  81. DEF outfilesize
  82.  
  83.     PrintF('Removing code \d... ',code)
  84.     MOVE.L buffer,A0 -> buffer pointer 1
  85.     MOVE.L A0,A1 -> buffer pointer 2
  86.     MOVE.L A0,A2 -> store pointer to buffer start
  87.     MOVE.L code,D0 -> cache code in D0
  88.     MOVE.L bufferlen,D1 -> buffer length
  89.     SUBQ.L #1,D1 -> decrement for dbcc
  90.     ADD.L #$10000,D1 -> increment upper word (outerloop must jump to innerloop at least once)
  91.     BRA.S startouterloop
  92. outerloop:
  93.     SWAP D1 -> fetch lower word of counter
  94. innerloop:
  95.     MOVE.B (A0),(A1)+
  96.     CMP.B (A0)+,D0
  97.     BNE.S dontremove
  98.     LEA -1(A1),A1
  99. dontremove:
  100.     DBF D1,innerloop
  101. startouterloop:
  102.     SWAP D1 -> fetch upper word of counter
  103.     DBF D1,outerloop
  104.     SUB.L A2,A1 -> subtract buffer start pointer from pointer 2
  105.     MOVE.L A1,outfilesize
  106.     PrintF('done (\d characters removed).\n',bufferlen-outfilesize)
  107. ENDPROC outfilesize
  108.  
  109. PROC replacecode(buffer,bufferlen,code,code2)
  110. DEF changes
  111.  
  112.     PrintF('Replacing code \d with code \d... ',code,code2)
  113.     MOVE.L buffer,A0 -> buffer pointer
  114.     MOVE.L code,D0 -> cache code in D0
  115.     MOVE.L code2,D2 -> cache code2 in D0
  116.     MOVE.L bufferlen,D1 -> buffer length
  117.     SUBQ.L #1,D1 -> decrement for dbcc
  118.     ADD.L #$10000,D1 -> increment upper word (outerloop must jump to innerloop at least once)
  119.     MOVEQ #0,D3
  120.     BRA.S startouterloop2
  121. outerloop2:
  122.     SWAP D1 -> fetch lower word of counter
  123. innerloop2:
  124.     CMP.B (A0)+,D0
  125.     BNE.S dontreplace
  126.     MOVE.B D2,-1(A0)
  127.     ADDQ.L #1,D3
  128. dontreplace:
  129.     DBF D1,innerloop2
  130. startouterloop2:
  131.     SWAP D1 -> fetch upper word of counter
  132.     DBF D1,outerloop2
  133.     MOVE.L D3,changes
  134.     PrintF('done (\d characters replaced).\n',changes)
  135. ENDPROC changes
  136.